﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataUpload;
using System.Windows;
using logistics.WinForm;
using Logistics.Utils;
using System.Data;
using Logistics.DataManage.Server;

namespace Logistics
{
    class RegisterMgr
    {
        /// <summary>
        /// 验证登陆
        /// 读取配置文件中的注册信息状态（-2：基础文件设置出错；-1：未注册；0：已注册，但未审核；1：已审核）
        /// -2：弹出提示，基础文件损坏
        /// -1：未注册，此时先判断网络是否连接
        ///     如果网络连接不正常，则提示：请连接网络后再注册
        ///     如果网络连接正常，则读取服务器上此机器的注册状态（-1：未注册；0： 已注册，但未审核；1：已注册，且已审核）
        ///             Ⅰ、未注册：弹出注册框进行注册,注册完成之后更改配置文件状态为已注册未审核(IsApplication->true)
        ///             Ⅱ、已注册,但未审核：修改配置文件状态为已注册但未审核(IsApplication->true;IsChecked->false)
        ///             Ⅲ、已审核：修改配置文件状态为已审核(RegeditCode->mac;IsChecked->true) 
        /// 0：已注册，未审核
        ///     如果网络连接不正常，则提示：请连接网络,获取审核信息后再登陆
        ///     如果网络连接正常，则读取服务器上此机器的注册状态（-1：未注册；0： 已注册，但未审核；1：已注册，且已审核）
        ///             Ⅰ、未注册：弹出注册框进行注册,注册完成之后更改配置文件状态为已注册未审核(IsApplication->true)
        ///             Ⅱ、已注册,但未审核，则提示：信息审核中，请与管理员联系
        ///             Ⅲ、已审核：修改配置文件状态为已审核(RegeditCode->mac;IsChecked->true) 
        /// 1：已审核
        ///      如果网络连接不正常，判断当前机器MAC是否与配置文件中的mac相同
        ///             Ⅰ、如果相同则正常登陆
        ///             Ⅱ、如果不相同，退出登陆
        ///      如果网络连接正常，则读取服务器上此机器的注册状态（-1：未注册；0： 已注册，但未审核；1：已注册，且已审核）
        ///             Ⅰ、未注册：弹出注册框进行注册,注册完成之后更改配置文件状态为已注册未审核(IsApplication->true)
        ///             Ⅱ、已注册,但未审核：修改配置文件状态为已注册但未审核(IsApplication->true;IsChecked->false)
        ///             Ⅲ、已审核：判断当前机器MAC是否与配置文件中的mac相同
        ///                 a、如果相同则正常登陆
        ///                 b、如果不相同，退出登陆
        /// </summary>
        internal static bool SecurityCheckLogin()
        {
            String localFile = GlobalObjects.ConfigFileLocation;
            int regState = RegistrationBase.GetRegeditedState(localFile);
            return SecurityCheckLogin(regState);
        }
        private static bool SecurityCheckLogin(int localRegState)
        {
            string mac = MachineCode.GetMachineConfig("mac");

            String localFile = GlobalObjects.ConfigFileLocation;
            if (localRegState == -2)//配置文件缺少对应节点
            {
                MessageBox.Show("配置文件已损坏，请与管理员联系!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
            if (localRegState == 1)//已审核
            {
                //网络连接异常的情况下正常登陆
                RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationRegedit/IsApplication", "", "true");
                string m_mac = RegistrationBase.GetXmlDocumentNodeValue(localFile, "/system/SecurityCheck/ApplicationRegedit/RegeditCode", "");
                m_mac = GetDecryptionString(m_mac);
                if (String.Equals(mac, m_mac))
                {
                    return true;
                }
                MessageBox.Show("此机器为非正常注册机,请注册!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                return SecurityCheckLogin(-1);
            }

            //本地状态0与状态-1均要联网认证
            if(!NetworkRequirementForm.prompt("联网注册验证"))
                return false;//当前无法联网，用户选择了取消

            int ServerRegState = SecurityCheck();
            if (ServerRegState == 1)//服务器上此机器的注册信息是 已审核
            {
                mac = GetEncryptionString(mac);
                RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationRegedit/IsApplication", "", "true");
                RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationRegedit/RegeditCode", "", mac);
                RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationChecked/IsChecked", "", "true");
                return true;
            }
            if (ServerRegState == 0)//服务器上此机器的注册信息是已注册但未审核
            {
                if (localRegState == -1)//配置文件未注册,修改为已注册未审核
                {
                    RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationRegedit/IsApplication", "", "true");
                    RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationRegedit/RegeditCode", "", "false");
                    RegistrationBase.ModifyXmlNode(localFile, "/system/SecurityCheck/ApplicationChecked/IsChecked", "", "false");
                }
                MessageBox.Show("注册信息审核中!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                return false;
            }
            //最后就是服务器端未注册
            if (ServerRegState == -1)
            {
                //弹出注册窗口
                RegeditWin regWin = new RegeditWin();
                System.Windows.Forms.DialogResult result = regWin.ShowDialog();
                if (result == System.Windows.Forms.DialogResult.Cancel)
                {
                    //用户选择了取消
                    return false;
                }
                //用户完成了注册操作，进入下一轮验证
                return SecurityCheckLogin();
            }

            //其它未知状态
            MessageBox.Show("服务器返回未知的注册状态，请与管理员联系！", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
            return false;
        }
        /// <summary>
        /// 安全校验
        /// </summary>
        /// <returns>返回-1：未注册；0：已注册未审核；1：已审核</returns>
        public static int SecurityCheck()
        {
            DataSet ds = RemoteDateServiceFactory.DateService.GetSynchronous(
                "MAC='" + MachineCode.GetMachineConfig("mac") + "'", "*", "UsersMachineRegister");
            if (ds.Tables[0].Rows.Count > 0)
            {
                if (ds.Tables[0].Rows[0]["ISUSED"].ToString().Equals("1") )
                {
                    //已注册，且已审核
                    return 1;
                }
                else
                {
                    //已注册，但未审核
                    return 0;
                }
            }
            else
                return -1;//未注册，数据库中找不到注册信息
        }
        /// <summary>
        /// 将字符串加密
        /// </summary>
        /// <param name="strs"></param>
        /// <returns></returns>
        public static string GetEncryptionString(string strs)
        {
            string rtnStr = "";
            //将MAC加密
            string edsKeys = "11234212";//加密密钥
            rtnStr = EncryptBase.EncryptDES(strs, edsKeys);
            return rtnStr;
        }
        /// <summary>
        /// 将字符串解密
        /// </summary>
        /// <param name="strs"></param>
        /// <returns></returns>
        public static string GetDecryptionString(string strs)
        {
            string rtnStr = "";
            //将MAC解密
            string edsKeys = "11234212";//解密密钥
            rtnStr = EncryptBase.DecryptDES(strs, edsKeys);
            return rtnStr;
        }
    }
}
